﻿/**
 * @file filemodelcontroller.h
 * @author huangxb
 * @email 18228033207@163.com
 * @date 2024.04.04
 * @license MIT License
 * @brief 用于对文件model初始化.
 *
 * @htmlonly
 * <span style="font-weight: bold">History</span>
 * @endhtmlonly
 * Version|Auther|Date|Describe
 * ------|----|------|--------
 * V1.0|huangxb|2024.04.04|创建
 */
#ifndef CFILEMODELCONTROLLER_H
#define CFILEMODELCONTROLLER_H

/* 自定义头文件 */
#include "singletont.h"
/* 库头文件 */
#include <QObject>

/* 前置声明 */
class CFileModel;
class CFileItem;
class QFileInfo;
class QDir;
class QFileIconProvider;

/** @brief 用于对文件model初始化. */
class CFileModelController
    : public QObject
    , public CSingleTonT<CFileModelController>
{
    Q_OBJECT

private:
    friend class CSingleTonT<CFileModelController>;

    CFileModel* m_pFileModel = nullptr;/**< 文件模型 */
    QFileIconProvider* m_pIconProvider = nullptr; /**< 用于获取文件图标 */

public:
    /**
     * @brief 重新设置model的数据.
     * @param[in] strPath 文件路径
     */
    void Load(const QString& strPath);

    /**
     * @brief 获取文件模型.
     * @return 文件模型
     */
    CFileModel* GetFileModel() const;

private:
    /**
     * @brief 构造函数.
     * @param[in] parent 父对象
     */
    explicit CFileModelController(QObject *parent = nullptr);

    /** @brief 析构函数. */
    ~CFileModelController();

    /**
     * @brief 加载一个文件信息到model中.
     * @param[in] fiFile 文件描述
     * @param[in] pParentItem 父节点
     * @return load后的节点
     */
    void DoLoadFile(const QFileInfo& fiFile, CFileItem* pParentItem = nullptr);

    /**
     * @brief 加载一个目录信息到model中.
     * @param[in] dir 目录描述
     * @param[in] pParentItem 父节点
     */
    void DoLoadDir(const QDir& dir, CFileItem* pParentItem = nullptr);

    /**
     * @brief 准备一个列对象.
     * @param[in] fiFile 文件信息
     * @param[in] nColumn 列
     * @see EFileModelHeader
     * @return 列对象，如果列不合法，会返回空
     */
    CFileItem* PrepareFileItem(const QFileInfo& fiFile, int nColumn) const;
};

/**
 * @brief 获取CFileModelController的单例对象.
 * @return 单例对象
 */
inline CFileModelController* FileModelController()
{
    return CFileModelController::GetInstance();
}

#endif // CFILEMODELCONTROLLER_H
